package com.wjm.serversocket.test3;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.SequenceInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;

/**
 * 序列流
 * 实现文件切割与合并,切割就是普通方法，合并才用到序列流
 */
public class IOTest {


    private static final int SIZE = 1024*1024*15;//15M一个文件

    public static void main(String[] args) throws Exception {


//        test0();//文件切割 ,切割一定要注意看切割的文件大小指定每个的大小，SIZE太大没法切，太小要切几千个文件的
        test1();//文件合并，合并得知道文件个数来合并，这里测试写死的已知的切出来的6个文件


    }

    private static void test1()throws Exception  {
        File fileOutDir = new File("I:\\test\\partfiles\\");
        if (!fileOutDir.exists()) {
            fileOutDir.mkdirs();
        }
        ArrayList<FileInputStream>al=new ArrayList<>();
        int s=6;//根据上面切割出来的文件是6个
        for(int x=1;x<=s;x++){
            al.add(new FileInputStream(new File(fileOutDir,x+".part")));
        }
        Enumeration<FileInputStream> en = Collections.enumeration(al);
        SequenceInputStream sis = new SequenceInputStream(en);//序列流 用来合并流 合并文件
//        File fileFis = new File("I:\\test\\英雄时刻_20171229-18点54分52s.avi");
        FileOutputStream fos = new FileOutputStream(new File(fileOutDir, "英雄时刻_20171229-18点54分52s.avi"));
        byte[]buf=new byte[1024];
        int len=0;
        while((len=sis.read(buf))!=-1){
            fos.write(buf,0,len);
        }
        fos.close();
        sis.close();


    }

    /**
     * 文件切割
     */
    private static void test0() throws Exception  {
        File fileFis = new File("I:\\test\\英雄时刻_20171229-18点54分52s.avi");
//        File fileOutDir = new File("I:\\test\\英雄时刻_20171229-18点54分52s.avi");

        FileInputStream fis = new FileInputStream(fileFis);
        byte[] buf = new byte[SIZE];
//        byte[] buf = new byte[1024];
        int len = 0;
        FileOutputStream fos = null;
        int count = 1;
        File fileOutDir = new File("I:\\test\\partfiles\\");
        if (!fileOutDir.exists()) {
            fileOutDir.mkdirs();
        }
        while ((len = fis.read(buf)) != -1) {
//            fos = new FileOutputStream(fileOutDir);
            fos = new FileOutputStream(new File(fileOutDir, (count++) + ".part"));
            fos.write(buf, 0, len);
        }
        fos.close();
        fis.close();
    }
}
